package pe.com.drokasa.android.client.controller.productos;

import java.util.List;

import pe.com.drokasa.android.client.R;
import pe.com.drokasa.android.client.constantes.Constantes;
import pe.com.drokasa.android.client.constantes.Constantes.MensajeSistema;
import pe.com.drokasa.android.client.controller.BaseActivity;
import pe.com.drokasa.android.client.model.Producto;
import pe.com.drokasa.android.client.service.ProductService;
import pe.com.drokasa.android.client.service.impl.ProductServiceImpl;
import pe.com.drokasa.android.client.util.VariableAplicacion;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.RadioButton;

/**
 * Activity de la vista de b&uacute;squeda de productos, donde se podr&aacute;
 * realizar la consulta por c&oacute;digo o nombre del producto.
 * 
 * @author Synopsis S.A
 *
 */
public class BusquedaProductosActivity extends BaseActivity
{
	private RadioButton codigoProductoSeleccionado;
	private RadioButton nombreProductoSeleccionado;
	private EditText codigoProducto;
	private EditText nombreProducto;
	
	private ProductService productosService;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_busqueda_productos);
		
		inicializarFormulario();
	}
	
	/**
	 * Inicializa el formulario de busqueda de productos
	 * obteniendo las referencias a los controles en pantalla.
	 */
	private void inicializarFormulario()
	{
		productosService = new ProductServiceImpl(this);
		
		codigoProducto = (EditText) findViewById(R.id.codigo_producto);
		codigoProductoSeleccionado = (RadioButton) findViewById(R.id.codigo_producto_seleccionado);
		codigoProductoSeleccionado.setOnClickListener(new OnClickListener() 
		{	
			@Override
			public void onClick(View view) 
			{
				habilitarCampos(view, nombreProducto, codigoProducto);
			}
		});
		
		nombreProducto = (EditText) findViewById(R.id.nombre_producto);
		nombreProductoSeleccionado = (RadioButton) findViewById(R.id.nombre_producto_seleccionado);
		nombreProductoSeleccionado.setOnClickListener(new OnClickListener() 
		{	
			@Override
			public void onClick(View view) 
			{
				habilitarCampos(view, codigoProducto, nombreProducto);
			}
		});
	}
	
    /**
     * Evalua si el RadioButton enviado como parametro ha sido seleccionado, si
     * es asi se habilita el campo relacionado al RadioButton y se deshabilita
     * el otro campo.
     * 
     * @param view
     *            Representa RadioButton que sera verificado para determinar si
     *            esta o no seleccinado.
     * @param campoParaDeshabilitar
     *            Representa campo que se deshabilitara.
     * @param campoParaHabilitar
     *            Representa campo que se habilitara.
     */
    private void habilitarCampos(View view, EditText campoParaDeshabilitar, EditText campoParaHabilitar)
    {
        RadioButton radioButton = (RadioButton) view;
        if (radioButton.isChecked())
        {
            campoParaDeshabilitar.setText("");
            campoParaDeshabilitar.setEnabled(false);
            campoParaDeshabilitar.setFocusable(false);
            campoParaDeshabilitar.setFocusableInTouchMode(false);
            campoParaHabilitar.setEnabled(true);
            campoParaHabilitar.setFocusable(true);
            campoParaHabilitar.setFocusableInTouchMode(true);
            campoParaHabilitar.requestFocus();
        }
    }
    
    /**
     * M&eacute;todo encargado de realizar la b&uacute;squeda de productos
     * de acuerdo a los criterios ingresados en pantalla.
     * 
     * @param botonBuscar
     */
    public void buscar(View botonBuscar)
    {
    	deshabilitarBoton(botonBuscar);
    	String criterioBusqueda;
    	if(codigoProductoSeleccionado.isChecked())
    	{
    		criterioBusqueda = codigoProducto.getText().toString();
    		if("".equals(criterioBusqueda))
    		{
    			mostrarAlertDialogErrorValidacion(MensajeSistema.ERROR_INGRESO_CODIGO_PRODUCTO);
    		}
    		else
    		{
    			VariableAplicacion.setTipoBusqueda(Constantes.TIPO_BUSQUEDA_CODIGO);
    			VariableAplicacion.setCriterioBusqueda(criterioBusqueda);
    			new BuscarProductosTask().execute();
    		}
    	}
    	else if(nombreProductoSeleccionado.isChecked())
    	{
    		criterioBusqueda = nombreProducto.getText().toString();
    		if("".equals(criterioBusqueda))
    		{
    			mostrarAlertDialogErrorValidacion(MensajeSistema.ERROR_INGRESO_NOMBRE_PRODUCTO);
    		}
    		else
    		{
    			VariableAplicacion.setTipoBusqueda(Constantes.TIPO_BUSQUEDA_NOMBRE);
    			VariableAplicacion.setCriterioBusqueda(criterioBusqueda);
    			new BuscarProductosTask().execute();
    		}
    	}
    }
	
	/**
	 * @see pe.com.drokasa.android.client.controller.BaseActivity#onCreateOptionsMenu(android.view.Menu)
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) 
	{
		return super.onCreateOptionsMenu(menu);
	}
	
	/**
	 * Clase encargada de realizar la consulta de productos de manera as&iacute;ncrona
	 * hacia la base de datos local.
	 * 
	 * @author Synopsis S.A
	 *
	 */
	public class BuscarProductosTask extends AsyncTask<Void, Void, Boolean>
	{
		private final ProgressDialog dialog = new ProgressDialog(BusquedaProductosActivity.this);
		
		/**
		 * @see android.os.AsyncTask#onPreExecute()
		 */
		@Override
		protected void onPreExecute() 
		{
			this.dialog.setIndeterminate(true);
			this.dialog.setMessage(MensajeSistema.INFORMACION_CARGANDO);
			this.dialog.show();
		}
		
		/**
		 * @see android.os.AsyncTask#doInBackground(Params[])
		 */
		@Override
		protected Boolean doInBackground(Void... params) 
		{
			String criterioBusqueda = VariableAplicacion.getCriterioBusqueda();
			if(Constantes.TIPO_BUSQUEDA_CODIGO.equals(VariableAplicacion.getTipoBusqueda()))
			{
				VariableAplicacion.setObjeto(VariableAplicacion.PRODUCTOS, productosService.obtenerProductosPorCodigo(criterioBusqueda));
			}
			else if(Constantes.TIPO_BUSQUEDA_NOMBRE.equals(VariableAplicacion.getTipoBusqueda()))
			{
				VariableAplicacion.setObjeto(VariableAplicacion.PRODUCTOS, productosService.obtenerProductosPorNombre(criterioBusqueda));
			}
			return true;
		}
		
		/**
		 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
		 */
		@Override
		protected void onPostExecute(Boolean result) 
		{
			if (this.dialog.isShowing())
			{
				this.dialog.dismiss();
			}
			
			if(result)
			{
				@SuppressWarnings("unchecked")
				List<Producto> resultados = (List<Producto>) VariableAplicacion.getObjeto(VariableAplicacion.PRODUCTOS);
				
				if(resultados.isEmpty())
				{
					elementoSeleccionadoIniciadorAccion.setEnabled(true);
					mostrarAlertDialogInformacion(MensajeSistema.INFORMACION_NO_RESULTADOS_BUSQUEDA);
				}
				else
				{
					elementoSeleccionadoIniciadorAccion.setEnabled(true);
					startActivity(new Intent(BusquedaProductosActivity.this, ResultadosBusquedaActivity.class));	
				}
			}
		}
	}
}